﻿using System;
using System.Xml;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using C1.Silverlight;
using C1.Silverlight.Chart;
using C1.Silverlight.Data;

namespace slaChart
{
    public partial class MainPage : UserControl
    {

        #region Members

        string sWebServiceUrl = @"http://sp.korablik.local:95/ws/CheckPoints.aspx";
        //string sWebServiceDetailUrl = "http://sp.korablik.local:88/ws/CheckPointsData.aspx";
        int mYear = 0;  // Год для запроса
        int mMonth = 0; // Месяц для запроса
        Random _rnd = new Random(0); // Переменная для анимации
        List<dsChart> sChart; // Класс данных для отчета
        C1.Silverlight.Chart.C1Chart mDetailChart; // Диаграмма
        // Справочник месяца
        public List<string> mMonthName = new List<string>() { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "	Октябрь", "Ноябрь", "Декабрь" };

        #endregion

        #region Constructors

        public MainPage()
        {
            // Заполняем начальные переменные
            mYear = DateTime.Today.Year;
            mMonth = DateTime.Today.Month;

            InitializeComponent();

            //-- Обновление значений в заголовке
            UpdateYearMonth();

            //Инициализация диаграммы
            _legend.Chart = _chart;
            //Получение данных
            StartChart();

            App.Current.Host.Content.Resized += new EventHandler(Content_Resized);
        }

        #endregion

        #region Forms Events

        public void bExec_Click(object sender, RoutedEventArgs e)
        {
            StartChart();
        }

        void pe_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            //-----------------------------------------
            // Показ детальной информации по легенде --
            //-----------------------------------------

            // Получение легенды и его значений
            PlotElement pe = (PlotElement)sender;
            XYDataSeries ds = pe.DataPoint.Series as XYDataSeries;
            DataPoint dp = pe.DataPoint;
            int RowCount = dp.PointIndex;
            List<dsChart> sChart = ds.ItemsSource as List<dsChart>;
            dsChart mRow = sChart[RowCount];
            Rect rc = ((Path)pe.Shape).Data.Bounds;

            // Создание окна для детальной информации
            C1.Silverlight.C1Window w = new C1Window();
            w.Left = e.GetPosition(null).X;
            w.Top = e.GetPosition(null).Y;
            w.Header = mRow.Shop + " (" + mYear + "-" + mMonth + "-" + mRow.day + ") Всего = " + mRow.count.ToString();
            mDetailChart = new C1Chart();
            mDetailChart.Width = 350;
            mDetailChart.Height = 250;

            // Вызываем веб-сервис для получение детальной информации
            //DetailChart(mRow.Shop, mRow.day);
            w.Content = mDetailChart;
            w.Height = 300;
            w.Width = 400;
            w.CenterOnScreen();
            w.Show();
            //--
        }

        void Content_Resized(object sender, EventArgs e)
        {
            // Обновление элементов отображения 
            double tWidth = App.Current.Host.Content.ActualWidth;
            double tHeight = App.Current.Host.Content.ActualHeight;
        }

        void pe_MouseEnter(object sender, MouseEventArgs e)
        {

            PlotElement pe = (PlotElement)sender;
            Rect rc = ((Path)pe.Shape).Data.Bounds;
            C1.Silverlight.C1Window w = new C1Window();
            w.Left = e.GetPosition(null).X;
            w.Top = e.GetPosition(null).Y;
            w.Header = "test";
            w.Height = 100;
            w.Width = 200;
            w.Show();
        }

        private void bDate1_Click(object sender, RoutedEventArgs e)
        {
            if (mMonth == 1)
            {
                mMonth = 12;
                mYear--;
            }
            else
            {
                mMonth--;
            }
            UpdateYearMonth();
        }

        private void bDate2_Click(object sender, RoutedEventArgs e)
        {
            if (mMonth == 12)
            {
                mMonth = 1;
                mYear++;
            }
            else
            {
                mMonth++;
            }
            UpdateYearMonth();
        }

        #endregion

        #region Chart

        public void addSeries(C1Chart chart, string name, List<dsChart> mList)
        {
            // Добавление в диаграмму новой легенды
            int len = new DateTime(mYear, mMonth, 1).AddMonths(1).AddDays(-1).Day;
            int[] x = new int[len];
            int[] y = new int[len];
            int i = 0;
            foreach (dsChart row in mList)
            {
                x[i] = row.day;
                y[i] = row.count;
                i++;
            }
            if (len > i)
            {
                for (int j = i; j < len; j++)
                {
                    x[j] = j + 1;
                    y[j] = 0;
                }
            }
            XYDataSeries ds = new XYDataSeries();
            // определение события после загрузки легенды
            ds.PlotElementLoaded += new EventHandler(ds_PlotElementLoaded);
            ds.XValuesSource = x;
            ds.ValuesSource = y;
            ds.ItemsSource = mList;
            ds.Label = name;
            ds.ConnectionStrokeThickness = 3;
            chart.Data.Children.Add(ds);
        }

        #endregion

        #region Data        

        public void StartChart()
        {
            //Асинхронный вызов веб-сервиса для общего отчета
            WebClient wbcl = new WebClient();
            wbcl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(load_chart);
            Uri myUri = new Uri(sWebServiceUrl + "?year=" + mYear.ToString() + "&month=" + mMonth.ToString() + "&guid=" + Guid.NewGuid().ToString(), UriKind.Absolute);
            wbcl.DownloadStringAsync(myUri);
        }

        public void load_chart(object sender, DownloadStringCompletedEventArgs e)
        {
            // Ответ от сервиса
            // Проверка результата от сервиса
            if (e.Error != null)
            {
                MessageBox.Show("Error" + e.Error.Message);
                return;
            }
            XDocument doc = XDocument.Parse(e.Result);
            foreach (XElement grbs in doc.Elements("NewDataSet"))
            {
                // Обновляем диаграмму
                // Удаляем старые значения
                // Устанавливаем формат осей
                // Раскрываем XML
                _chart.BeginUpdate();
                _chart.Data.Children.Clear();
                _chart.View.AxisX.AnnoFormat = "0 ";
                _chart.View.AxisY.AnnoFormat = "0 ";
                foreach (XElement point in grbs.Elements("tbl"))
                {
                    sChart = new List<dsChart>();
                    string Shop = point.Element("Name").Value.ToString();
                    foreach (XElement row in point.Elements("row"))
                    {
                        dsChart sRow = new dsChart();
                        sRow.Shop = Shop;
                        sRow.day = int.Parse(row.Element("Day").Value);
                        sRow.count = int.Parse(row.Element("RealIn").Value);
                        sChart.Add(sRow);
                    }
                    // Добавление легенды
                    addSeries(_chart, Shop, sChart);
                }
                // Вывод диаграммы
                _chart.Width = App.Current.Host.Content.ActualWidth;
                _chart.View.Width = App.Current.Host.Content.ActualWidth;
                _chart.EndUpdate();
            }
        }                

        void ds_PlotElementLoaded(object sender, EventArgs e)
        {
            //----------------------
            // Анимация диаграммы --
            //----------------------
            PlotElement pe = (PlotElement)sender;
            // Устанавливаем тип курсора над легендой
            pe.Cursor = Cursors.Hand;
            // Определяем событие нажатия на легенду
            pe.MouseLeftButtonDown += new MouseButtonEventHandler(pe_MouseLeftButtonDown);
            // Определение физических размеров легенды
            Rect rc = ((Path)pe.Shape).Data.Bounds;
            ScaleTransform st = new ScaleTransform()
            {
                ScaleX = rc.Width,
                ScaleY = rc.Height 
            };
            pe.RenderTransform = st;
            pe.RenderTransformOrigin = new Point(0, 1);
            // Создаем класс Storyboard для анимации легенды
            Storyboard sb = new Storyboard() { Duration = new Duration(TimeSpan.FromSeconds(3)) };
            DoubleAnimation da1 = new DoubleAnimation();
            da1.To = 1.0;
            da1.From = 0.0;
            Storyboard.SetTarget(da1, st);
            Storyboard.SetTargetProperty(da1, new PropertyPath("ScaleX"));
            sb.Children.Add(da1);
            DoubleAnimation da2 = new DoubleAnimation();
            da2.To = 1.0;
            da2.From = 0.0;
            Storyboard.SetTarget(da2, st);
            Storyboard.SetTargetProperty(da2, new PropertyPath("ScaleY"));
            sb.Children.Add(da2);
            sb.Begin();
        }        

        //public void DetailChart(string mShop,int mDay)
        //{
        //    // вызов веб сервиса для получения детальной информации
        //    WebClient wbcl = new WebClient();
        //    wbcl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(load_detail_chart);
        //    Uri myUri = new Uri(sWebServiceDetailUrl + "?Year=" + mYear.ToString() + "&Month=" + mMonth.ToString() + "&day=" + mDay.ToString() + "&shop=" + mShop + "&guid=" + Guid.NewGuid().ToString(), UriKind.Absolute);
        //    wbcl.DownloadStringAsync(myUri);
        //}

        public void load_detail_chart(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show("Error" + e.Error.Message);
                return;
            }
            //--
            XDocument doc = XDocument.Parse(e.Result);
            foreach (XElement grbs in doc.Elements("grbs"))
            {
                mDetailChart.BeginUpdate();
                mDetailChart.Data.Children.Clear();
                //_chart.View.AxisX.IsTime = true;
                mDetailChart.View.AxisX.AnnoFormat = "0 ";
                mDetailChart.View.AxisY.AnnoFormat = "0 ";
                mDetailChart.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
                mDetailChart.VerticalAlignment = System.Windows.VerticalAlignment.Top;
                List<dsHour> sHour = new List<dsHour>();
                foreach (XElement row in grbs.Elements("row"))
                {
                    dsHour sRow = new dsHour();
                    sRow.hour = int.Parse(row.Element("hour").Value);
                    sRow.count = int.Parse(row.Element("in").Value);
                    sHour.Add(sRow);
                }
                //--
                int len = sHour.Count;
                int[] x = new int[len];
                int[] y = new int[len];
                int i = 0;
                foreach (dsHour row in sHour)
                {
                    x[i] = row.hour;
                    y[i] = row.count;
                    i++;
                }
                XYDataSeries ds = new XYDataSeries();
                ds.PlotElementLoaded += new EventHandler(ds_PlotElementLoaded_detail);
                ds.XValuesSource = x;
                ds.ValuesSource = y;
                ds.ItemsSource = sHour;
                //ds.Label = name;
                ds.ConnectionStrokeThickness = 3;

                mDetailChart.Data.Children.Add(ds);
                //--
                mDetailChart.EndUpdate();
                //--
            }
        }

        void ds_PlotElementLoaded_detail(object sender, EventArgs e)
        {
            PlotElement pe = (PlotElement)sender;
            pe.Cursor = Cursors.Hand;

            Rect rc = ((Path)pe.Shape).Data.Bounds;
            ScaleTransform st = new ScaleTransform()
            {
                ScaleX = rc.Width, 
                ScaleY = rc.Height
            };
            pe.RenderTransform = st;
            pe.RenderTransformOrigin = new Point(0, 1);

            Storyboard sb = new Storyboard() { Duration = new Duration(TimeSpan.FromSeconds(3)) };
            DoubleAnimation da1 = new DoubleAnimation(); 
            da1.To = 1.0;
            da1.From = 0.0;
            Storyboard.SetTarget(da1, st);
            Storyboard.SetTargetProperty(da1, new PropertyPath("ScaleX"));
            sb.Children.Add(da1);
            DoubleAnimation da2 = new DoubleAnimation();
            da2.To = 1.0;
            da2.From = 0.0;
            Storyboard.SetTarget(da2, st);
            Storyboard.SetTargetProperty(da2, new PropertyPath("ScaleY"));
            sb.Children.Add(da2);
            sb.Begin();
        }        

        public void UpdateYearMonth()
        {
            eWhereBlock.Text = mYear.ToString() + "-" + mMonthName[mMonth - 1];
        }

        #endregion

    }
}
